/**
*
*/
package com.itextpdf.text;
import com.itextpdf.testutils.CompareTool;
import com.itextpdf.text.io.RandomAccessSourceFactory;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.draw.DottedLineSeparator;
import com.itextpdf.text.pdf.draw.LineSeparator;
import com.itextpdf.text.pdf.parser.*;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
/**
* @author redlab
*
*/
public class ChunkTest {
/**
*
*/
private static final String _4SPACES = " 4spaces ";
private static final String _TAB = "\t4spaces ";
public static final String SOURCE11 = "./src/test/resources/com/itextpdf/text/Chunk/source11.pdf";
public static final String SOURCE12 = "./src/test/resources/com/itextpdf/text/Chunk/source12.pdf";
public static final String SOURCE13 = "./src/test/resources/com/itextpdf/text/Chunk/source13.pdf";
public static final String SOURCE14 = "./src/test/resources/com/itextpdf/text/Chunk/source14.pdf";
public static final String SOURCE15 = "./src/test/resources/com/itextpdf/text/Chunk/source15.pdf";
public static final String SOURCE16 = "./src/test/resources/com/itextpdf/text/Chunk/source16.pdf";
public static final String SOURCE17 = "./src/test/resources/com/itextpdf/text/Chunk/source17.pdf";
public static final String SOURCE_FOLDER = "./src/test/resources/com/itextpdf/text/Chunk/";
public static final String OUTFOLDER = "./target/com/itextpdf/test/Chunk";
public static final String OUTTABSPACED = OUTFOLDER + "/tabspaceDocument.pdf";
public static final String OUTABSPACEC = OUTFOLDER + "/tabspaceColumnText.pdf";
public static final String OUTTABD = OUTFOLDER + "/tabDocument.pdf";
public static final String OUTABC = OUTFOLDER + "/tabColumnText.pdf";
public static final String OUTABSTOPSC = OUTFOLDER + "/tabstopsColumnText.pdf";
public static final String OUTSPTRIMDOC = OUTFOLDER + "/spaceTrimDoc.pdf";
public static final String OUTSPTRIMCT = OUTFOLDER + "/spaceTrimColumnText.pdf";
@Before
public void Init() throws IOException{
new File(OUTFOLDER).mkdirs();
File f = new File(OUTTABSPACED.substring(0,32));
if (!f.exists())
f.mkdir();
}
@Test
public void prependingWhitspaces() {
Chunk c = new Chunk(_4SPACES);
Assert.assertEquals("difference in string", _4SPACES, c.getContent());
}
@Test
public void prependingTab() {
Chunk c = new Chunk(_TAB);
Assert.assertEquals("difference in string", "4spaces ", c.getContent());
}
@Test
public void tabspaceDocumentTest() throws Exception {
Font f = FontFactory.getFont(FontFactory.COURIER, 11);
FileOutputStream fs = new FileOutputStream(OUTTABSPACED);
Document doc = new Document();
PdfWriter writer = PdfWriter.getInstance(doc, fs);
Paragraph p;
writer.setCompressionLevel(0);
doc.open();
p = new Paragraph(new Chunk("Hello world", f));
addTabspaces(p, f, 0);
doc.add(p);
p = new Paragraph(new Chunk("Hello World!!!"));
addTabspaces(p, f, 0);
doc.add(p);
f.setSize(16);
p = new Paragraph(new Chunk("Hello world", f));
addTabspaces(p, f, 0);
doc.add(p);
f = FontFactory.getFont(FontFactory.TIMES_ROMAN, 12);
p = new Paragraph(new Chunk("Hello world", f));
addTabspaces(p, f, 0);
doc.add(p);
f.setSize(20);
p = new Paragraph(new Chunk("Hello world", f));
addTabspaces(p, f, 0);
doc.add(p);
doc.close();
fs.close();
Assert.assertTrue(compareInnerText(SOURCE11, OUTTABSPACED));
}
@Test
public void tabspaceColumnTextTest() throws Exception {
Font f = FontFactory.getFont(FontFactory.COURIER, 11);
Document doc = new Document();
Paragraph p;
FileOutputStream fs = new FileOutputStream(OUTABSPACEC);
PdfWriter writer = PdfWriter.getInstance(doc, fs);
writer.setCompressionLevel(0);
doc.open();
ColumnText ct = new ColumnText(writer.getDirectContent());
ct.setSimpleColumn(36, 36, 436, 800);
p = new Paragraph(new Chunk("Hello world", f));
addTabspaces(p, f, 0);
ct.addElement(p);
p = new Paragraph(new Chunk("Hello World!!!"));
addTabspaces(p, f, 0);
ct.addElement(p);
f.setSize(16);
p = new Paragraph(new Chunk("Hello world", f));
addTabspaces(p, f, 0);
ct.addElement(p);
f = FontFactory.getFont(FontFactory.TIMES_ROMAN, 12);
p = new Paragraph(new Chunk("Hello world", f));
addTabspaces(p, f, 0);
ct.addElement(p);
f.setSize(20);
p = new Paragraph(new Chunk("Hello world", f));
addTabspaces(p, f, 0);
ct.addElement(p);
ct.go();
doc.close();
fs.close();
Assert.assertTrue(compareInnerText(SOURCE12, OUTABSPACEC));
}
@Test
public void tabDocumentTest() throws Exception {
Font f = FontFactory.getFont(FontFactory.COURIER, 11);
FileOutputStream fs = new FileOutputStream(OUTTABD);
Document doc = new Document();
PdfWriter writer = PdfWriter.getInstance(doc, fs);
Paragraph p;
java.util.List<TabStop> tabStopsList = new ArrayList<TabStop>();
tabStopsList.add(new TabStop(100, new DottedLineSeparator()));
tabStopsList.add(new TabStop(200, new LineSeparator(), TabStop.Alignment.CENTER));
tabStopsList.add(new TabStop(300, new DottedLineSeparator(), TabStop.Alignment.RIGHT));
writer.setCompressionLevel(0);
doc.open();
p = new Paragraph(new Chunk("Hello world", f));
addTabs(p, f, 0, "la|la");
p.setTabSettings(new TabSettings(tabStopsList, 50));
doc.add(p);
tabStopsList = new ArrayList<TabStop>();
tabStopsList.add(new TabStop(100, new DottedLineSeparator()));
tabStopsList.add(new TabStop(200, new LineSeparator(), TabStop.Alignment.ANCHOR));
tabStopsList.add(new TabStop(300, new DottedLineSeparator(), TabStop.Alignment.ANCHOR));
p = new Paragraph(new Chunk("Hello World!!!"));
p.setTabSettings(new TabSettings(tabStopsList, 50));
addTabs(p, f, 12, "l.aal");
addTabs(p, f, 12, "laa.l");
addTabs(p, f, 12, "la.al");
doc.add(p);
f.setSize(16);
tabStopsList = new ArrayList<TabStop>();
tabStopsList.add(new TabStop(100, new DottedLineSeparator()));
tabStopsList.add(new TabStop(200, new LineSeparator(), TabStop.Alignment.ANCHOR, ','));
tabStopsList.add(new TabStop(300, new DottedLineSeparator(), TabStop.Alignment.ANCHOR));
p = new Paragraph(new Chunk("Hello world", f));
p.setTabSettings(new TabSettings(tabStopsList, 50));
addTabs(p, f, 13, "l.aal");
addTabs(p, f, 11, "l,aal");
addTabs(p, f, 11, "laa.l");
addTabs(p, f, 11, "laa,l");
doc.add(p);
f = FontFactory.getFont(FontFactory.TIMES_ROMAN, 12);
p = new Paragraph(new Chunk("Hello world", f));
p.setTabSettings(new TabSettings(38));
addTabs(p, f, 0);
doc.add(p);
f.setSize(20);
p = new Paragraph(new Chunk("Hello world", f));
p.setTabSettings(new TabSettings(38));
addTabs(p, f, 0);
doc.add(p);
doc.close();
fs.close();
Assert.assertTrue(compareInnerText(SOURCE13, OUTTABD));
}
@Test
public void tabColumnTextTest() throws Exception {
Font f = FontFactory.getFont(FontFactory.COURIER, 11);
Document doc = new Document();
Paragraph p;
FileOutputStream fs = new FileOutputStream(OUTABC);
PdfWriter writer = PdfWriter.getInstance(doc, fs);
writer.setCompressionLevel(0);
doc.open();
ColumnText ct = new ColumnText(writer.getDirectContent());
ct.setSimpleColumn(36, 36, 436, 800);
java.util.List<TabStop> tabStopsList = new ArrayList<TabStop>();
tabStopsList.add(new TabStop(100, new DottedLineSeparator()));
tabStopsList.add(new TabStop(200, new LineSeparator(), TabStop.Alignment.CENTER));
tabStopsList.add(new TabStop(300, new DottedLineSeparator(), TabStop.Alignment.RIGHT));
p = new Paragraph(new Chunk("Hello world", f));
p.setTabSettings(new TabSettings(tabStopsList, 50));
addTabs(p, f, 0, "la|la");
ct.addElement(p);
tabStopsList = new ArrayList<TabStop>();
tabStopsList.add(new TabStop(100, new DottedLineSeparator()));
tabStopsList.add(new TabStop(200, new LineSeparator(), TabStop.Alignment.ANCHOR));
tabStopsList.add(new TabStop(300, new DottedLineSeparator(), TabStop.Alignment.ANCHOR));
p = new Paragraph(new Chunk("Hello World!!!"));
p.setTabSettings(new TabSettings(tabStopsList, 50));
addTabs(p, f, 12, "l.aal");
addTabs(p, f, 12, "laa.l");
addTabs(p, f, 12, "la.al");
ct.addElement(p);
f.setSize(16);
p = new Paragraph(new Chunk("Hello world", f));
tabStopsList = new ArrayList<TabStop>();
tabStopsList.add(new TabStop(100, new DottedLineSeparator()));
tabStopsList.add(new TabStop(200, new LineSeparator(), TabStop.Alignment.ANCHOR, ','));
tabStopsList.add(new TabStop(300, new DottedLineSeparator(), TabStop.Alignment.ANCHOR));
p.setTabSettings(new TabSettings(tabStopsList, 50));
addTabs(p, f, 15, "l.aal");
addTabs(p, f, 13, "laa,l");
addTabs(p, f, 13, "laa.l");
addTabs(p, f, 13, "l,aal");
ct.addElement(p);
f = FontFactory.getFont(FontFactory.TIMES_ROMAN, 12);
p = new Paragraph(new Chunk("Hello world", f));
p.setTabSettings(new TabSettings(38));
addTabs(p, f, 0);
ct.addElement(p);
f.setSize(20);
p = new Paragraph(new Chunk("Hello world", f));
p.setTabSettings(new TabSettings(38));
addTabs(p, f, 0);
ct.addElement(p);
ct.go();
doc.close();
fs.close();
Assert.assertTrue(compareInnerText(SOURCE14, OUTABC));
}
@Test
public void tabStopsColumnText() throws Exception{
Document document = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(OUTABSTOPSC));
document.open();
Font oFont1 = FontFactory.getFont(BaseFont.ZAPFDINGBATS, 15, Font.UNDEFINED);
Font oFont2 = FontFactory.getFont(BaseFont.COURIER, 15, Font.UNDEFINED);
Font oFont3 = FontFactory.getFont(BaseFont.TIMES_ROMAN, 15, Font.UNDEFINED);
Font oFont4 = FontFactory.getFont(BaseFont.HELVETICA, 15, Font.UNDEFINED);
Image oImg = Image.getInstance("./src/test/resources/com/itextpdf/text/Chunk/logo.gif");
PdfContentByte canvas = writer.getDirectContentUnder();
java.util.List<TabStop> tabStops = new ArrayList<TabStop>();
//tabStops.add(new TabStop(100, new DottedLineSeparator()));
//tabStops.add(new TabStop(200, new DottedLineSeparator()));
tabStops.add(new TabStop(200, new DottedLineSeparator()));
//tabStops.add(new TabStop(300, new DottedLineSeparator()));
tabStops.add(new TabStop(400, new DottedLineSeparator()));
//tabStops.add(new TabStop(500, new DottedLineSeparator()));
//tabStops.add(new TabStop(550, new DottedLineSeparator()));
Paragraph oPara = new Paragraph("Hello World! ", oFont1);
oPara.setTabSettings(new TabSettings(tabStops));
oPara.add(new Chunk("iText ® is a library that allows you to create and manipulate PDF documents.", oFont2));
oPara.add(new Chunk("It enables developers looking to enhance web- and other applications with dynamic PDF docu", oFont3));
oPara.add(Chunk.TABBING);
oPara.add(new Chunk("ment generation and/or manipulation.", oFont3));
oPara.add(new Chunk(oImg, 0, 0, true));
//oPara.Add(new Chunk(new TestVerticalPositionMark()));
oPara.add(Chunk.TABBING);
oPara.add(new Chunk("Developers can use iText to:", oFont4));
ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase("|100"), 100, 500, 0);
ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase("|200"), 200, 500, 0);
ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase("|250"), 250, 500, 0);
ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase("|300"), 300, 500, 0);
ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase("|400"), 400, 500, 0);
ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase("|500"), 500, 500, 0);
ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase("|550"), 550, 500, 0);
ColumnText oColTxt1 = new ColumnText(canvas);
oColTxt1.setSimpleColumn(0, 400, 595, 500);
oColTxt1.addElement(oPara);
oColTxt1.go();
document.close();
Assert.assertTrue(compareInnerText(SOURCE15, OUTABSTOPSC));
}
@Test
public void spaceTrimPdfDocumentTest() throws DocumentException, IOException {
Document doc = new Document(PageSize.A4, 50, 30, 50, 30);
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(new File(OUTSPTRIMDOC)));
doc.open();
Phrase under = new Phrase();
under.setFont(new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.UNDERLINE));
under.add(new Chunk(" 1 1 9 "));
doc.add(under);
doc.close();
writer.close();
PdfReader reader = new PdfReader(OUTSPTRIMDOC);
MyTextRenderListener listener = new MyTextRenderListener();
PdfContentStreamProcessor processor = new PdfContentStreamProcessor(listener);
PdfDictionary pageDic = reader.getPageN(1);
PdfDictionary resourcesDic = pageDic.getAsDict(PdfName.RESOURCES);
processor.processContent(ContentByteUtils.getContentBytesForPage(reader, 1), resourcesDic);
//should be 60, as in @spaceTrimColumnTextTest
//Assert.assertTrue("Unexpected text length", listener.getText().length() == 60);
Assert.assertTrue("Unexpected text length", listener.getText().length() == 77);
}
@Test
public void spaceTrimColumnTextTest() throws DocumentException, IOException {
Document doc = new Document(PageSize.A4, 50, 30, 50, 30);
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(new File(OUTSPTRIMCT)));
doc.open();
Phrase under = new Phrase();
under.setFont(new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.UNDERLINE));
under.add(new Chunk(" 1 1 9 "));
Paragraph underlineTest = new Paragraph(under);
underlineTest.setKeepTogether(true);
doc.add(underlineTest);
doc.close();
writer.close();
PdfReader reader = new PdfReader(OUTSPTRIMCT);
MyTextRenderListener listener = new MyTextRenderListener();
PdfContentStreamProcessor processor = new PdfContentStreamProcessor(listener);
PdfDictionary pageDic = reader.getPageN(1);
PdfDictionary resourcesDic = pageDic.getAsDict(PdfName.RESOURCES);
processor.processContent(ContentByteUtils.getContentBytesForPage(reader, 1), resourcesDic);
Assert.assertTrue("Unexpected text length", listener.getText().length() == 60);
}
@Test
public void TabStopOutOfPageBoundDocumentTest() throws DocumentException, IOException {
Document doc = new Document(PageSize.A4, 36, 36, 0, 30);
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(OUTFOLDER + "/tabStopOutDocument.pdf"));
doc.open();
Font f = FontFactory.getFont(FontFactory.COURIER, 11);
f.setSize(16);
Paragraph p = new Paragraph(Chunk.TABBING);
p.add(new Chunk("Hello world", f));
ArrayList<TabStop> tabStopsList = new ArrayList<TabStop>();
tabStopsList.add(new TabStop(1000, new DottedLineSeparator()));
tabStopsList.add(new TabStop(1050, new LineSeparator(), TabStop.Alignment.ANCHOR, ','));
tabStopsList.add(new TabStop(1100, new DottedLineSeparator(), TabStop.Alignment.ANCHOR));
p.setTabSettings(new TabSettings(tabStopsList, 50));
addTabs(p, f, 15, "l.aal");
addTabs(p, f, 13, "laa,l");
addTabs(p, f, 13, "laa.l");
addTabs(p, f, 13, "l,aal");
doc.add(p);
doc.close();
writer.close();
Assert.assertTrue(compareInnerText(SOURCE16, OUTFOLDER + "/tabStopOutDocument.pdf"));
}
@Test
public void TabStopOutOfPageBoundColumnTextTest() throws DocumentException, IOException {
Font f = FontFactory.getFont(FontFactory.COURIER, 11);
Document doc = new Document();
Paragraph p;
FileOutputStream fs = new FileOutputStream(OUTFOLDER + "/tabStopOutColumnText.pdf");
PdfWriter writer = PdfWriter.getInstance(doc, fs);
writer.setCompressionLevel(0);
doc.open();
ColumnText ct = new ColumnText(writer.getDirectContent());
ct.setSimpleColumn(36, 0, 436, 836);
f.setSize(16);
p = new Paragraph(Chunk.TABBING);
p.add(new Chunk("Hello world", f));
ArrayList<TabStop> tabStopsList = new ArrayList<TabStop>();
tabStopsList.add(new TabStop(1000, new DottedLineSeparator()));
tabStopsList.add(new TabStop(1050, new LineSeparator(), TabStop.Alignment.ANCHOR, ','));
tabStopsList.add(new TabStop(1100, new DottedLineSeparator(), TabStop.Alignment.ANCHOR));
p.setTabSettings(new TabSettings(tabStopsList, 50));
addTabs(p, f, 15, "l.aal");
addTabs(p, f, 13, "laa,l");
addTabs(p, f, 13, "laa.l");
addTabs(p, f, 13, "l,aal");
ct.addElement(p);
ct.go();
doc.close();
writer.close();
Assert.assertTrue(compareInnerText(SOURCE17, OUTFOLDER + "/tabStopOutColumnText.pdf"));
}
private static class MyTextRenderListener implements RenderListener {
protected StringBuffer buffer = new StringBuffer();
public void beginTextBlock() {
}
public void endTextBlock() {
}
public void renderImage(ImageRenderInfo renderInfo) {
}
public void renderText(TextRenderInfo renderInfo) {
buffer.append(renderInfo.getText());
buffer.append("\n");
}
public String getText(){
return buffer.toString();
}
}
public void addTabspaces(Paragraph p, Font f, int count)
{
p.add(Chunk.createTabspace());
p.add(new Chunk("|", f));
if (count == 16)
return;
else
addTabspaces(p, f, count + 1);
}
public void addTabs(Paragraph p, Font f, int count, String text)
{
p.add(Chunk.TABBING);
p.add(new Chunk(text, f));
if (count == 17)
return;
else
addTabs(p, f, count + 1, text);
}
public void addTabs(Paragraph p, Font f, int count)
{
p.add(Chunk.TABBING);
p.add(new Chunk("|", f));
if (count == 17)
return;
else
addTabs(p, f, count + 1);
}
public boolean compareInnerText(String path1, String path2) throws IOException{
PdfReader reader1 = new PdfReader(path1);
byte[] streamBytes1 = reader1.getPageContent(1);
PRTokeniser tokenizer1 = new PRTokeniser(new RandomAccessFileOrArray(new RandomAccessSourceFactory().createSource(streamBytes1)));
PdfReader reader2 = new PdfReader(path2);
byte[] streamBytes2 = reader2.getPageContent(1);
PRTokeniser tokenizer2 = new PRTokeniser(new RandomAccessFileOrArray(new RandomAccessSourceFactory().createSource(streamBytes2)));
try{
while (tokenizer1.nextToken()) {
if (!tokenizer2.nextToken())
return false;
else {
if (tokenizer1.getTokenType() != tokenizer2.getTokenType())
return false;
else {
if (tokenizer1.getTokenType() == PRTokeniser.TokenType.NUMBER)
{
if (Math.abs(Float.parseFloat(tokenizer1.getStringValue())
-Float.parseFloat(tokenizer2.getStringValue())) > 0.1)
return false;
}
else
if (!tokenizer1.getStringValue().equals(tokenizer2.getStringValue()))
return false;
}
}
}
return true;
} finally {
reader1.close();
reader2.close();
}
}
@Test
public void testImageChunkOnGenericTag() throws IOException, DocumentException, InterruptedException {
String fileName = "testImageChunkOnGenericTag.pdf";
FileOutputStream fos = new FileOutputStream(OUTFOLDER + fileName);
Document doc = new Document(PageSize.LETTER);
PdfWriter writer = PdfWriter.getInstance(doc, fos);
writer.setPageEvent(new EventHandler());
doc.open();
Image img = Image.getInstance(writer.getDirectContent().createTemplate(100f, 25f));
System.out.println(img.getHeight());
Chunk c = new Chunk(img, 0, 0);
c.setGenericTag("foobar");
doc.add(c);
doc.close();
CompareTool compareTool = new CompareTool();
String error = compareTool.compareByContent(OUTFOLDER + fileName, SOURCE_FOLDER + "cmp_" + fileName, OUTFOLDER, "diff_");
if (error != null) {
Assert.fail(error);
}
}
class EventHandler extends PdfPageEventHelper {
public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
PdfContentByte cb = writer.getDirectContent();
cb.saveState();
cb.setColorStroke(BaseColor.BLACK);
cb.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight());
cb.stroke();
cb.restoreState();
writer.getDirectContent().beginText();
Font f = FontFactory.getFont(BaseFont.COURIER, 8f);
writer.getDirectContent().setFontAndSize(f.getBaseFont(), 8f);
writer.getDirectContent().showTextAligned(Element.ALIGN_LEFT, String.valueOf(rect.getHeight()), rect.getLeft(), rect.getBottom(), 0);
writer.getDirectContent().endText();
}
}
}